package src;
/** ODBC-Connection

*/

/** ODBC-Connection

*/

import java.sql.*;
import java.util.Vector;

public class DataBaseConnection {

  public Connection con = null;
  private Statement stmt;
  private ResultSet rset;
  private String mode;

  DataBaseConnection (String driver, String url, String modePar,
                  String username, String password) throws Exception {

     mode = modePar;
	 connect(driver, url, username, password);
  }

  
  
  
  public void connect(String driver, String url, 
                      String username, String password) throws Exception {
  
     try {      
	   if ( con != null) {
	      con.close();
	   }
	   
       Class.forName(driver);
       con = DriverManager.getConnection(url,username,password);
       
     } catch (ClassNotFoundException cnfe) {
         throw new Exception("Error en: Class.forName(\""+driver+"\")");
     } catch (SQLException sqle) {
         con = null;       
         throw new Exception("Error ("+sqle+") connecting to '"+url+"',"+
         					  username+","+password);
     }     
     System.out.println("ODBCConnection:Connected to:\n\t"+url+","+
     					      username+","+password);
  }

  
  
  public void updateValueSQL ( String table, String valueCol, 
  							   String valueVal,	String whereclause ) 
  			  throws Exception {	     

     String sentence="";    
     if (valueVal.equals("false") || valueVal.equals("true"))   
         sentence = "update "+table+" set "+valueCol+"="+valueVal+
     				   " where "+ whereclause;
     else
	 sentence = "update "+table+" set "+valueCol+"='"+valueVal+
     				   "' where "+ whereclause;
  	 try {
  	 	
        if (mode.equals("real")){
           execSqlModificacion(sentence);
        }
     } catch (SQLException e) {   
           con = null;
           throw new Exception("Exception "+e);
     }
  }
  

  // Metodo especifico para insertar un jugador en la base de datos 
  @SuppressWarnings("unchecked")
  public void insertRowSQLJugador(String from,String fechaPartida,String nombreJugador, 
		  String carta1, String carta2, int saldoInicial, int saldoFinal, int apuestaMasAlta,
		  String cartaMejor1, String cartaMejor2,String cartaMejor3, String cartaMejor4,
		  String cartaMejor5)throws Exception{
	 
	String sentence=null; 
	boolean encontrado=false;
	Vector claves=null;
	Vector nombres=null;
	
	claves = selectSQL("fechaPartida",from,null);
	nombres = selectSQL("nombreJugador",from,null);
	
	String partidaAux;
	String jugadorAux;
	for(int i=0; i<claves.size();i++){
		
			partidaAux=claves.elementAt(i).toString();
			partidaAux=partidaAux.substring(1,partidaAux.length()-1);
			
			jugadorAux=nombres.elementAt(i).toString();
			jugadorAux=jugadorAux.substring(1,jugadorAux.length()-1);
		
		System.out.println(partidaAux);  // muestra las fechas de los jugadores que hay en la base de datos
		
		if(partidaAux.equals(fechaPartida) && jugadorAux.equals(nombreJugador)){
			encontrado=true;
			break;
		}		
	}	

	try {
		if(!encontrado){
			sentence = "insert into "+from+" values ('"+fechaPartida+"','"+nombreJugador+"','"+carta1+
					"','"+carta2+"','"+saldoInicial+"','"+saldoFinal+"','"+apuestaMasAlta+
					"','"+cartaMejor1+"','"+cartaMejor2+"','"+cartaMejor3+"','"+cartaMejor4+
					"','"+cartaMejor5+"')";
			execSqlInsert(sentence);
		}else{
			modifiedRowSQLJugador(from, fechaPartida, nombreJugador, carta1,
					  carta2, saldoInicial, saldoFinal, apuestaMasAlta,
					  cartaMejor1, cartaMejor2, cartaMejor3, cartaMejor4,
					  cartaMejor5);
		}
	}catch (SQLException e) {   
		con = null;
		throw new Exception("Exception "+e);
	}
  }
  
  
//Metodo especifico para modificar una fila de la tabla jugador en la base de datos 
  @SuppressWarnings("unchecked")
  public void modifiedRowSQLJugador(String from,String fechaPartidaB,String nombreJugadorB, String carta1B,
		  String carta2B, int saldoInicialB, int saldoFinalB,  int apuestaMasAltaB,
		  String cartaMejor1B, String cartaMejor2B,String cartaMejor3B, String cartaMejor4B,
		  String cartaMejor5B)throws Exception{
	 
	String sentenceModificacion=null; 
	String sentenceConsulta=null;
	// Cosas a cambiar tras el set
	String condicionConsulta="@";
	Vector resultConsulta=null;
	
	sentenceConsulta = "SELECT * FROM "+from+" WHERE fechaPartida= '"+fechaPartidaB+"'AND NombreJugador= '"+nombreJugadorB+"'";
	
	try {
        resultConsulta = execSqlConsulta(sentenceConsulta);
        
        if(resultConsulta.size()!=0){
    
	       	 if(carta1B!=null){
	       		 condicionConsulta+="jugador.carta1= '"+carta1B+"' ,";
	       	 }
	       	 if(carta2B!=null){
	   			condicionConsulta+=" jugador.carta2= '"+carta2B+"' ,";
	     	 }
	       	 if(saldoInicialB!=-1){
	       		 condicionConsulta+="jugador.saldoInicial= '"+saldoInicialB+"' ,";
	       	 }
	       	 if(saldoFinalB!=-1){
	       		 condicionConsulta+="jugador.saldoFinal= '"+saldoFinalB+"' ,";
	       	 }
	       	 
	       	if(apuestaMasAltaB!=-1){
	       		 condicionConsulta+="jugador.apuestaMasAlta= '"+apuestaMasAltaB+"' ,";
	       	 }
	       	
	       	if(cartaMejor1B!=null){
	       		 condicionConsulta+="jugador.cartaMejor1= '"+cartaMejor1B+"' ,";
	       	 }
	       	
	       	if(cartaMejor2B!=null){
	       		 condicionConsulta+="jugador.cartaMejor2= '"+cartaMejor2B+"' ,";
	       	 }
	       	
	       	if(cartaMejor3B!=null){
	       		 condicionConsulta+="jugador.cartaMejor3= '"+cartaMejor3B+"' ,";
	       	 }
	       	
	       	if(cartaMejor4B!=null){
	       		 condicionConsulta+="jugador.cartaMejor4= '"+cartaMejor4B+"' ,";
	       	 }
	       	
	       	if(cartaMejor5B!=null){
	       		 condicionConsulta+="jugador.cartaMejor5= '"+cartaMejor5B+"' ,";
	       	 }
	       	
	       	 
        }
        /////
        // Quitamos la coma del final y la @ del inicio
        condicionConsulta=condicionConsulta.substring(1,condicionConsulta.length()-1);
               
        // Aqui tenemos la sentencia de la consulta
        sentenceModificacion= "update "+from+" set "+condicionConsulta+"where jugador.fechaPartida= '"+fechaPartidaB+"'AND NombreJugador= '"+nombreJugadorB+"';";
        
        execSqlModificacion(sentenceModificacion); 	   
        
                
     } catch (SQLException e) {
        con = null;
        throw new Exception("Exception "+e);
     }      
 }
  
  
  
  
//Metodo especifico para insertar una partida en la base de datos 
  @SuppressWarnings("unchecked")
  public void insertRowSQLPartida(String from,String fechaPartida,String nombrePartida, int numMano, String carta1, String carta2,String carta3, String carta4, String carta5)throws Exception{
	 
	String sentence=null; 
	boolean encontrado=false;
	Vector claves=null;
	Vector nombres=null;
	
	claves=selectSQL("fechaPartida",from,null);
	nombres=selectSQL("nombrePartida",from,null);
	
	String fechaAux;
	String nombresAux;
	for(int i=0; i<claves.size();i++){
		
		fechaAux=claves.elementAt(i).toString();
		fechaAux=fechaAux.substring(1,fechaAux.length()-1);
			
		nombresAux=nombres.elementAt(i).toString();
		nombresAux=nombresAux.substring(1,nombresAux.length()-1);

				
		if(fechaAux.equals(fechaPartida) && nombresAux.equals(nombrePartida)){
			encontrado=true;
			break;
		}		
	}	

	try {
		if(!encontrado){
			System.out.println("insetar");
			sentence = "insert into "+from+" values ('"+fechaPartida+"','"+nombrePartida+"','"+numMano+"','"+carta1+"','"+carta2+"','"+carta3+"','"+carta4+"','"+carta5+"')";
			execSqlInsert(sentence);
		}else{
			
			modifiedRowSQLPartida(from,fechaPartida,nombrePartida, numMano, carta1, carta2, carta3, carta4, carta5);
			
		}
	}catch (SQLException e) {   
		con = null;
		throw new Exception("Exception "+e);
	}
  }
  
  
  
//Metodo especifico para modificar una fila de la tabla partida en la base de datos 
  @SuppressWarnings("unchecked")
  public void modifiedRowSQLPartida(String from,String fechaPartidaB,String nombrePartidaB, int numManoB,String carta1B, String carta2B,String carta3B, String carta4B,String carta5B)throws Exception{
	 
	String sentenceModificacion=null; 
	String sentenceConsulta=null;
	// Cosas a cambiar tras el set
	String condicionConsulta="@";
	Vector resultConsulta=null;
	
	sentenceConsulta = "SELECT * FROM "+from+" WHERE fechaPartida= '"+fechaPartidaB+"';";
	
	try {
        resultConsulta = execSqlConsulta(sentenceConsulta);
        
        if(resultConsulta.size()!=0){
       	 if(nombrePartidaB!=null){
       		 condicionConsulta=condicionConsulta+="partida.nombrePartida= '"+nombrePartidaB+"',";
       	 }    	 
       	 if(numManoB!=-1){
       		 condicionConsulta=condicionConsulta+="partida.numMano= '"+numManoB+"' ,";
       	 }
       	 if(carta1B!=null){
       		 condicionConsulta=condicionConsulta+="partida.carta1= '"+carta1B+"' ,";
       	 }
       	if(carta2B!=null){
      		 condicionConsulta=condicionConsulta+="partida.carta2= '"+carta2B+"' ,";
      	 }
       	if(carta3B!=null){
      		 condicionConsulta=condicionConsulta+="partida.carta3= '"+carta3B+"' ,";
      	 }
       	if(carta4B!=null){
      		 condicionConsulta=condicionConsulta+="partida.carta4= '"+carta4B+"' ,";
      	 }
       	if(carta5B!=null){
      		 condicionConsulta=condicionConsulta+="partida.carta5= '"+carta5B+"' ,";
      	 }
        }
        
        // Si acaba con una coma la quitamos al acabar con una coma estamos seguros de que es distinto de null
        
        condicionConsulta=condicionConsulta.substring(1,condicionConsulta.length()-1);
        
        
        // Aqui tenemos la sentencia de la consulta
        sentenceModificacion= "update "+from+" set "+condicionConsulta+"where partida.fechaPartida= '"+fechaPartidaB+"';";
        
        execSqlModificacion(sentenceModificacion); 	   
        
                
     } catch (SQLException e) {
        con = null;
        throw new Exception("Exception "+e);
     }      
 }  
  
  
// Metodo especifico para insertar la relacion entre una partida y un jugadoren la base de datos 

  public void insertRowSQLPartidaJugador(String from,String fechaPartida,String nombrePartida,String nombreJugador)throws Exception{
	 
	String sentence=null; 
	
	sentence = "insert into "+from+" values ('"+fechaPartida+"','"+nombrePartida+"','"+nombreJugador+"')";

	
	try {
		execSqlInsert(sentence);

	}catch (SQLException e) {   
		con = null;
		throw new Exception("Exception "+e);
	}
  }
  
//Metodo especifico para insertar los valores de una fila de la tabla estadistica en la base de datos 
  @SuppressWarnings("unchecked")
  public void insertRowSQLEstadistica(String from,String fechaPartida,String nombreJugador,String nombrePartida,int dineroInicial, int dineroFinal, int dineroPerdido,
		  String mejorMano, int mayorApuesta)throws Exception{
	 
	  String sentence=null; 
	  boolean encontrado=false;
	  Vector claves=null;
		
	  sentence = "insert into "+from+" values ('"+fechaPartida+"','"+nombrePartida+"','"+nombrePartida+"','"+dineroInicial+"','"+dineroFinal+"','"+dineroPerdido+"','"+mejorMano+"','"+mayorApuesta+"')";
	  
	  claves=selectSQL("fechaPartida",from,null);
	  
	  for(int i=1; i<claves.size();i++){
			if(claves.elementAt(i).equals(fechaPartida)){
				encontrado=true;
				break;
			}		
		}	
	  
	  try {
		  if(!encontrado || claves.size()==0){
			  execSqlInsert(sentence);
		  }		
	  }catch (SQLException e) {   
		con = null;
		throw new Exception("Exception "+e);
	}
  }
     
//Metodo especifico para modificar una fila de la tabla estadistica en la base de datos 
  @SuppressWarnings("unchecked")
  public void modifiedRowSQLEstadistica(String from,String fechaPartidaB,String nombreJugadorB,String nombrePartidaB, int dineroInicialB,int dineroFinalB, int dineroPerdidoB,String mejorManoB, int mayorApuestaB)throws Exception{
	 
	String sentenceModificacion=null; 
	String sentenceConsulta=null;
	// Cosas a cambiar tras el set
	String condicionConsulta="@";
	Vector resultConsulta=null;
	
	sentenceConsulta = "SELECT * FROM "+from+" WHERE 'fechaPartida'= '"+fechaPartidaB+"';";
	
	try {
        resultConsulta = execSqlConsulta(sentenceConsulta);
        
        if(resultConsulta.size()!=0){
        
        if(nombreJugadorB!=null){
          	 condicionConsulta=condicionConsulta+="estadistica.nombreJugador= '"+nombreJugadorB+"',";
        }
       	 if(nombrePartidaB!=null){
       		 condicionConsulta=condicionConsulta+="estadistica.nombrePartida= '"+nombrePartidaB+"',";
       	 }    	 
       	 if(dineroInicialB!=-1){
       		 condicionConsulta=condicionConsulta+="estadistica.dineroInicial= '"+dineroInicialB+"' ,";
       	 }
       	if(dineroFinalB!=-1){
      		 condicionConsulta=condicionConsulta+="estadistica.dineroFinal= '"+dineroFinalB+"' ,";
      	 }
       	if(dineroPerdidoB!=-1){
      		 condicionConsulta=condicionConsulta+="estadistica.dineroPerdido= '"+dineroPerdidoB+"' ,";
      	 }
       	 if(mejorManoB!=null){
       		 condicionConsulta=condicionConsulta+="estadistica.mejorMano= '"+mejorManoB+"' ,";
       	 }
       	if(mayorApuestaB!=-1){
      		 condicionConsulta=condicionConsulta+="estadistica.mayorApuesta= '"+mayorApuestaB+"' ,";
      	 }
       	
        }
        
        // Si acaba con una coma la quitamos al acabar con una coma estamos seguros de que es distinto de null
        condicionConsulta=condicionConsulta.substring(2,condicionConsulta.length()-1);
                
        // Aqui tenemos la sentencia de la consulta
        sentenceModificacion= "update "+from+" set "+condicionConsulta+"where estadistica.fechaPartida= '"+fechaPartidaB+"';";
        
        execSqlModificacion(sentenceModificacion); 	   
        
                
     } catch (SQLException e) {
        con = null;
        throw new Exception("Exception "+e);
     }      
 }  

  // Delete identico para todas las operaciones de la clase
  public void deleteRowSQL(String from,String key, String where) throws Exception{
	  
	  String sentence=null;
	  sentence= "delete from "+from+" where ("+key+"= '"+where+"')";
	  
	  try {
		  execSQLDelete(sentence);
	  } catch (SQLException e) {   
		  con = null;
		  throw new Exception("Exception "+e);
	  }
 }
  
// Metodo para eliminar un poco distinto al anterior ya que puede haber varios jugadores conectados a la misma partida a la misma hora
@SuppressWarnings("unchecked")
public void deleteRowSQLPartidaJugador(String from,String key, String where) throws Exception{
	  
	  String sentence=null;	  
	  sentence= "delete from "+from+" where ("+key+"= '"+where+"')";
	  Vector claves=null;
	  claves=selectSQL(key,from,null);
		
		for(int i=1; i<claves.size();i++){
			if(claves.elementAt(i).equals(key)){
				
				 try {
					  execSQLDelete(sentence);
				  } catch (SQLException e) {   
					  con = null;
					  throw new Exception("Exception "+e);
				  }
				
			}		
		}	
 }
	
  // Metodo generico para realizar consultas
  @SuppressWarnings("unchecked")
  public Vector selectSQL (String what, String from, String where) throws Exception {	

     Vector result=null;
     String sentence=null;
     if (where==null){       
     	sentence = "SELECT "+what+" FROM "+from;       
     } else {
     	sentence = "SELECT "+what+" FROM "+from+" WHERE "+where;
     }

     try {
        result = execSqlConsulta(sentence);
     } catch (SQLException e) {
        con = null;
        throw new Exception("Exception "+e);
     }      
     return result;
  }
  

  public void execSqlInsert(String sentence) throws SQLException {
	  
	     System.out.println ("execSqlInsert:Executing "+sentence);
	  	
	  	 con.setAutoCommit(true);
	     stmt = con.createStatement();
	     
	     int ret = stmt.executeUpdate(sentence);
	     
	     if (ret==0) {
	        System.out.println("Inserted columns: "+String.valueOf(ret));
	     } else {
	        System.out.println("Inserted columns: "+String.valueOf(ret));
	     }
	     
		System.out.println ("execSqlInsert:Executed with no errors");
  }
  
  
  
  public void execSqlModificacion(String sentence) throws SQLException {
  
     System.out.println ("execSqlModificacion:Executing "+sentence);
  	
  	 con.setAutoCommit(true);
     stmt = con.createStatement();
     
     int ret = stmt.executeUpdate(sentence);
     
     if (ret==0) {
        System.out.println("Modified columns: "+String.valueOf(ret));
        System.out.println("\tProbably it doesn't exist row matching");
     } else {
        System.out.println("Modified columns: "+String.valueOf(ret));
     }
	System.out.println ("execSqlModificacion:Executed with no errors");
  }

  
  
  
  public void execSQLDelete(String sentence) throws SQLException {
	  
	     System.out.println ("execSqlDeleted:Executing "+sentence);
	  	
	  	 con.setAutoCommit(true);
	     stmt = con.createStatement();
	     int ret = stmt.executeUpdate(sentence);
	     if (ret==0) {
	        System.out.println("Deleted columns: "+String.valueOf(ret));
	        System.out.println("\tProbably it doesn't exist row matching");
	     } else {
	        System.out.println("Deleted columns: "+String.valueOf(ret));
	     }
		System.out.println ("execSqlDelete:Executed with no errors");
	}
  
  
  
  
  
  @SuppressWarnings("unchecked")
  public Vector execSqlConsulta(String sentence) throws SQLException {
  	
     System.out.println ("execSqlConsulta:Executing "+sentence);
  
     Vector retval = new Vector();
     stmt = con.createStatement();
     rset = stmt.executeQuery(sentence);
     ResultSetMetaData rsmd = rset.getMetaData();
     int ncols = rsmd.getColumnCount();
     int nrows = 0;
  
     while (rset.next()) {
        Vector columns = new Vector();
        for (int i = 1; i <= ncols; i++) { 
        	String valor=rset.getString(i);
        	columns.addElement(valor);
        }
        retval.addElement(columns);
        nrows++;
     }
     System.out.println ("execSqlConsulta:Executed with no errors");
     return retval;
  }
}